/**
 * ControladoraBDEstudiante.java
 */

/**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.datos;

import java.sql.Blob;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.LinkedList;
import adsec.entidades.Estudiante;


public class ControladoraBDEstudiante {

    private Connection conexion;
    private AdministradorConexion adminConexion;
    
    public ControladoraBDEstudiante(){
        adminConexion = AdministradorConexion.getInstancia();
    }

    public Estudiante consultarEstudiante(String cedula){
        Estudiante estudiante = null;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarEstudiante(conexion, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    if(resultado.next())
                        estudiante = this.crearEstudiante(resultado);
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return estudiante;
    }//fin de consultarEstudiante

    public LinkedList<Estudiante> consultarEstudiantes(){
        LinkedList<Estudiante> lista = new LinkedList<Estudiante>();
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarEstudiantes(conexion);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    while(resultado.next()){
                        Estudiante estudiante = this.crearEstudianteLight(resultado);
                        lista.add(estudiante);
                    }//fin de while
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return lista;
    }//fin de consultarEstudiantes

    public InputStream consultarFotoEstudiante(String cedula){
        InputStream foto = null;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spConsultarFotoEstudiante(conexion, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    ResultSet resultado = procedimiento.getResultSet();
                    if(resultado.next()){
                        Blob blobFoto = resultado.getBlob("foto");
                        foto = blobFoto.getBinaryStream();
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return foto;
    }//fin de consultarEstudiante

    public int insertarEstudiante(Estudiante estudiante){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spInsertarEstudiante(conexion, estudiante);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de insertarEstudiante

    public int insertarFotoEstudiante(FileInputStream foto, String cedula){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spInsertarFotoEstudiante(conexion, foto, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }

    public int modificarEstudiante(Estudiante estudiante){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spModificarEstudiante(conexion, estudiante);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de modificarEstudiante

    public int modificarFotoEstudiante(FileInputStream foto, String cedula){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spModificarFotoEstudiante(conexion, foto, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }

    public int eliminarEstudiante(String cedula){
        int resultado = AdministradorConexion.QUERY_ERROR;
        conexion = adminConexion.getConexion();
        if(conexion != null){
            CallableStatement procedimiento = this.spEliminarEstudiante(conexion, cedula);
            if(procedimiento != null){
                try{
                    procedimiento.execute();
                    resultado = AdministradorConexion.QUERY_OK;
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
        }//fin de if
        adminConexion.cerrarConexion();
        return resultado;
    }//fin de eliminarEstudiante

    private CallableStatement spConsultarEstudiante(Connection conexion, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarEstudiante" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Estudiante.cedulaNC+"_p", cedula);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarEstudiante

    private CallableStatement spConsultarFotoEstudiante(Connection conexion, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarFotoEstudiante" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Estudiante.cedulaNC+"_p", cedula);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarEstudiante

    private CallableStatement spConsultarEstudiantes(Connection conexion){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL consultarEstudiantes()",
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spConsultarEstudiantes

    private CallableStatement spInsertarEstudiante(Connection conexion, Estudiante estudiante){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL insertarEstudiante" + UtilidadesCapaDatos.agregarParametros(19),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Estudiante.cedulaNC+"_p", estudiante.getCedula());
            procedimiento.setString(Estudiante.nombreNC+"_p", estudiante.getNombre());
            procedimiento.setString(Estudiante.apellidosNC+"_p", estudiante.getApellidos());
            procedimiento.setDate(Estudiante.fechaNacNC+"_p", estudiante.getFecha_nac());
            procedimiento.setInt(Estudiante.anioIngresoNC+"_p", estudiante.getAnioIngreso());
            procedimiento.setString(Estudiante.adecuacion1NC+"_p", estudiante.getAdecuacion1());
            procedimiento.setString(Estudiante.adecuacion2NC+"_p", estudiante.getAdecuacion2());
            procedimiento.setString(Estudiante.problemasSaludNC+"_p", estudiante.getProblemasSalud());
            procedimiento.setString(Estudiante.condSocAfectivaNC+"_p", estudiante.getCondSocioAfectiva());
            procedimiento.setString(Estudiante.condSocEconomicaNC+"_p", estudiante.getCondSocioEconomica());
            procedimiento.setString(Estudiante.telefono1NC+"_p", estudiante.getTelefono1());
            procedimiento.setString(Estudiante.telefono2NC+"_p", estudiante.getTelefono2());
            procedimiento.setString(Estudiante.sexoNC+"_p", estudiante.getSexo());
            procedimiento.setString(Estudiante.nacionalidadNC+"_p", estudiante.getNacionalidad());
            procedimiento.setString(Estudiante.provinciaNC+"_p", estudiante.getProvincia());
            procedimiento.setString(Estudiante.cantonNC+"_p", estudiante.getCanton());
            procedimiento.setString(Estudiante.distritoNC+"_p", estudiante.getDistrito());
            procedimiento.setString(Estudiante.otrasSeniasNC+"_p", estudiante.getOtrasSenias());
            procedimiento.setString(Estudiante.escuelaProcedenciaNC+"_p", estudiante.getEscuelaProcedencia());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spInsertarEstudiante

    private CallableStatement spInsertarFotoEstudiante(Connection conexion, FileInputStream foto, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL insertarFotoEstudiante" + UtilidadesCapaDatos.agregarParametros(2),
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Estudiante.cedulaNC+"_p", cedula);
            procedimiento.setBlob("foto_p", foto);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }

    private CallableStatement spModificarEstudiante(Connection conexion, Estudiante estudiante){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL modificarEstudiante" + UtilidadesCapaDatos.agregarParametros(19),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Estudiante.cedulaNC+"_p", estudiante.getCedula());
            procedimiento.setString(Estudiante.nombreNC+"_p", estudiante.getNombre());
            procedimiento.setString(Estudiante.apellidosNC+"_p", estudiante.getApellidos());
            procedimiento.setDate(Estudiante.fechaNacNC+"_p", estudiante.getFecha_nac());
            procedimiento.setInt(Estudiante.anioIngresoNC+"_p", estudiante.getAnioIngreso());
            procedimiento.setString(Estudiante.adecuacion1NC+"_p", estudiante.getAdecuacion1());
            procedimiento.setString(Estudiante.adecuacion2NC+"_p", estudiante.getAdecuacion2());
            procedimiento.setString(Estudiante.problemasSaludNC+"_p", estudiante.getProblemasSalud());
            procedimiento.setString(Estudiante.condSocAfectivaNC+"_p", estudiante.getCondSocioAfectiva());
            procedimiento.setString(Estudiante.condSocEconomicaNC+"_p", estudiante.getCondSocioEconomica());
            procedimiento.setString(Estudiante.telefono1NC+"_p", estudiante.getTelefono1());
            procedimiento.setString(Estudiante.telefono2NC+"_p", estudiante.getTelefono2());
            procedimiento.setString(Estudiante.sexoNC+"_p", estudiante.getSexo());
            procedimiento.setString(Estudiante.nacionalidadNC+"_p", estudiante.getNacionalidad());
            procedimiento.setString(Estudiante.provinciaNC+"_p", estudiante.getProvincia());
            procedimiento.setString(Estudiante.cantonNC+"_p", estudiante.getCanton());
            procedimiento.setString(Estudiante.distritoNC+"_p", estudiante.getDistrito());
            procedimiento.setString(Estudiante.otrasSeniasNC+"_p", estudiante.getOtrasSenias());
            procedimiento.setString(Estudiante.escuelaProcedenciaNC+"_p", estudiante.getEscuelaProcedencia());
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spModificarEstudiante

    private CallableStatement spModificarFotoEstudiante(Connection conexion, FileInputStream foto, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL modificarFotoEstudiante" + UtilidadesCapaDatos.agregarParametros(2),
            ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Estudiante.cedulaNC+"_p", cedula);
            procedimiento.setBlob("foto_p", foto);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }

    private CallableStatement spEliminarEstudiante(Connection conexion, String cedula){
        CallableStatement procedimiento = null;
        try{
            procedimiento = conexion.prepareCall("CALL eliminarEstudiante" + UtilidadesCapaDatos.agregarParametros(1),
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            procedimiento.setString(Estudiante.cedulaNC+"_p", cedula);
        }catch(SQLException sqlException){
            sqlException.printStackTrace();
        }
        return procedimiento;
    }//fin de spEliminarEstudiante

    private Estudiante crearEstudiante(ResultSet resultSet) throws SQLException{
        Estudiante estudiante = new Estudiante();
        estudiante.setCedula(resultSet.getString(Estudiante.cedulaNC));
        estudiante.setNombre(resultSet.getString(Estudiante.nombreNC));
        estudiante.setApellidos(resultSet.getString(Estudiante.apellidosNC));
        estudiante.setFecha_nac(resultSet.getDate(Estudiante.fechaNacNC));
        estudiante.setAnioIngreso(resultSet.getInt(Estudiante.anioIngresoNC));
        estudiante.setAdecuacion1(resultSet.getString(Estudiante.adecuacion1NC));
        estudiante.setAdecuacion2(resultSet.getString(Estudiante.adecuacion2NC));
        estudiante.setProblemasSalud(resultSet.getString(Estudiante.problemasSaludNC));
        estudiante.setCondSocioAfectiva(resultSet.getString(Estudiante.condSocAfectivaNC));
        estudiante.setCondSocioEconomica(resultSet.getString(Estudiante.condSocEconomicaNC));
        estudiante.setTelefono1(resultSet.getString(Estudiante.telefono1NC));
        estudiante.setTelefono2(resultSet.getString(Estudiante.telefono2NC));
        estudiante.setSexo(resultSet.getString(Estudiante.sexoNC));
        estudiante.setNacionalidad(resultSet.getString(Estudiante.nacionalidadNC));
        estudiante.setProvincia(resultSet.getString(Estudiante.provinciaNC));
        estudiante.setCanton(resultSet.getString(Estudiante.cantonNC));
        estudiante.setDistrito((resultSet.getString(Estudiante.distritoNC)));
        estudiante.setOtrasSenias(resultSet.getString(Estudiante.otrasSeniasNC));
        estudiante.setEscuelaProcedencia(resultSet.getString(Estudiante.escuelaProcedenciaNC));
        return estudiante;
    }//fin de crearEstudiante

    private Estudiante crearEstudianteLight(ResultSet resultSet) throws SQLException{
        Estudiante estudiante = new Estudiante();
        estudiante.setCedula(resultSet.getString(Estudiante.cedulaNC));
        estudiante.setNombre(resultSet.getString(Estudiante.nombreNC));
        estudiante.setApellidos(resultSet.getString(Estudiante.apellidosNC));
        estudiante.setTelefono1(resultSet.getString(Estudiante.telefono1NC));
        
        return estudiante;
    }//fin de crearEstudiante

}//fin de la clase ControladoraBDEstudiante
